// const moment = require('moment')
const qs = require('qs')
module.exports = (options, app) => {
  return async function(ctx, next) {
    // 拿到不需要验证的token的路由
    const whiteList = app.config.whiteList
    // 获取当前路由
    const query = '?' + qs.stringify(ctx.query)
    const url = ctx.url.replace(query, '') // 去除query参数

    const apiFlag = url.includes(app.config.baseUrl) // 判断是否是版本控制内的api
    if (!apiFlag) {
      await next()
      return
    }
    const realMyUrl = ctx.request.method.toLowerCase() + ':' + url.replace(app.config.baseUrl, '')
    const paramsReg = /\{\S{1,}\}/ // {...} 正则
    const flag = whiteList.some(item => { // 判断当前路由是否需要验证token
      if (paramsReg.test(item)) { // 正则替代有params的路由
        item = item.replace(paramsReg, '\\S{1,}').replace(new RegExp('\/', 'g'), '\\/').replace(':', '\\:')
        return new RegExp(item).test(realMyUrl)
      }
      return item === realMyUrl
    })

    // 获取token,并把Bearer 截取掉，解析的时候不需要加上Bearer,如果没有传入token，则为空
    const token = ctx.headers.authorization ? ctx.headers.authorization.substring(7) : ''
    try {
      const decode = await app.jwt.verify(token, app.config.jwt.secret)
      ctx.state.userInfo = decode
    } catch (err) {
      if (!flag) {
        if (err.name === 'TokenExpiredError') {
          ctx.throw(401, '[Token Expired] 权限过期，请重新登录')
        } else if (err.name === 'JsonWebTokenError') {
          // 请求权限中心接口验证
          const authRes = await ctx.curl(`${app.config.authUrl}/auth/v1/tokens/check`, {
            method: 'POST',
            contentType: 'json', // 以 JSON 格式处理返回的请求体
            data: {
              token
            },
            dataType: 'json'// 以 JSON 格式处理返回的响应体
          })
          if (authRes.data.success === true) {
            ctx.state.userInfo = authRes.data.resData.filter(item => {
              return item.type === 'UserId'
            }).map(item => {
              return {
                id: item.value
              }
            })[0]
          } else if (authRes.data.errCode === '40005') {
            ctx.throw(401, '[Token Expired] 权限过期，请重新登录')
          } else {
            ctx.throw(401, '[Unauthorized] Token 令牌不合法!')
          }
        }
        // if (err.name === 'JsonWebTokenError') {
        //   ctx.throw(401, '[Unauthorized] Token 令牌不合法!')
        //   // ctx.throw(401, '[Unauthorized] ' + err.message)
        // } else if (err.name === 'TokenExpiredError') {
        //   ctx.throw(401, '[Token Expired] 权限过期，请重新登录')
        // }
      }
    }
    await next()
  }
}
